Запомнить сайт

Обратная связь

Добавить в избранное

Главная страница Инфа по реестру и биосу Соц опрос Реклама на сайте
Гостевая книга Учебники по программированию Немного о операционных системах Наш форум

Вы пришли из
Браузер у вас:
Сегодня:
Разрешение монитора:

на сайте на Народ.Ру на Яндексе


87 Хитростей и трюков для Visual Basica

|1|2|3|

  1. УПРАВЛЕНИЕ СОБЫТИЯМИ В КОМБОБОКСЕ
  2. КОММЕНТИРОВАНИЕ И РАСКОММЕНТИРОВАНИЕ БЛОКОВ КОДА
  3. ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ДЛЯ НЕОБЯЗАТЕЛЬНЫХ ПАРАМЕТРОВ
  4. НЕ СОЗДАВАЙТЕ ALIAS-НЫХ ПЕРЕМЕННЫХ
  5. ЦЕНТРИРОВАНИЕ ФОРМЫ НА ЭКРАНЕ
  6. НЕ УВЛЕКАЙТЕСЬ АВТООПТИМИЗИЦИЕЙ FAST CODE
  7. НЕ ВСЕ ШАБЛОНЫ СОЗДАНЫ ОДИНАКОВО
  8. НАСТРОЙКА ТУЛБАРОВ В VB
  9. КАК СПРЯТАТЬ ВСЕ ОКОШКИ ПРОЕКТА
  10. STANDALONE БИБЛИОТЕКИ ТИПОВ
  11. OBJECT BROWSER ДЛЯ НАХОЖДЕНИЯ НЕДОКУМЕНТИРОВАННЫХ ВОЗМОЖНО
  12. АДРЕС ПЕРЕМЕННОЙ
  13. КОГДА BENCHMARK’и ПРОГРАММЫ ДЛЯТСЯ СУТКАМИ
  14. APP.PATH МОЖЕТ ВОЗВРАЩАТЬ UNC-ПУТИ
  15. ЕЩЕ ОБ УНИВЕРСАЛЬНЫХ ПАРАМЕТРАХ МАССИВОВ
  16. УМЕНЬШИТЬ РАЗМЕР КОДА, ИСПОЛЬЗУЯ ОПЕРАТОРЫ IIF И SWITCH
  17. УСКОРЬТЕ ВАШ КОД ИСПОЛЬЗОВАНИЕМ CHOOSE
  18. GOSUBS РАБОТАЮТ МЕДЛЕННО В ОТКОМПИЛИРОВАННЫХ ПРОГРАММАХ
  19. «ARRAY» - ОТНЫНЕ ЭТО ОШИБОЧНОЕ ИМЯ ДЛЯ ПЕРЕМЕННЫХ
  20. ЗАПУСК AUTOMATION MANAGER КАК HIDDEN ЗАДАЧИ
  21. ПРОБЛЕМЫ СО ВСПЛЫВАЮЩИМИ МЕНЮ
  22. ИСПОЛЬЗОВАНИЕ КОЛЛЕКЦИИ ДЛЯ ОТБОРА УНИКАЛЬНЫХ ЗНАЧЕНИЙ
  23. СОЗДАНИЕ «УДАЛЕННО КОНТРОЛИРУЕМЫХ» ФОРМ
  24. ЗАПИСЬ ТЕКУЩЕЙ ПОЗИЦИИ И РАЗМЕРА ФОРМЫ ПРИ ПОМОЩИ SAVESETT
  25. ЭФФЕКТИВНОЕ ИСПОЛЬЗОВАНИЕ ВНУТРЕННИХ VB КОНСТАНТ
  26. ПРАВИЛЬНЫЙ ТЕСТ НА "FILE EXIST"
  27. ПРОЦЕДУРЫ, РАБОТАЮЩИЕ С ГРУППАМИ КОНТРОЛОВ
  28. УЛУЧШЕНИЕ СКРОЛЛИНГА РИСУНКОВ
  29. ЗАШИФРОВАННЫЕ ПАРОЛИ
  30. ПРОПИСНЫЕ-СТРОЧНЫЕ БУКВЫ - СОВЕТ ПО СЛЕЖЕНИЮ ЗА РЕГИСТРОМ

    1 УПРАВЛЕНИЕ СОБЫТИЯМИ В КОМБОБОКСЕ

     

    Две проблемы могут приключиться, когда смущенный юзер ползает по комбобоксу при помощи мышки вверх и вниз, а затем нажатием на Enter делает свой юзерский выбор. Во-первых, нажатие на серую стрелочку вызывает два события: Change и Click. Во-вторых, нажатие на Enter перемещает фокус к следующему элементу формы, тогда как нажатие на кнопку мыши не вызывает подобного эффекта (т.е. фокус остается на комбобоксе). Поэтому, если Ваш код помещен в секцию события Change, то на стрелочки вверх/вниз (клавиатурой) вызовет это событие, чего Вы, естественно, не хотите. Напротив, если Вы помещаете свой код только в секцию события Lost Focus и юзер щелкает мышью на своем выборе, то фокус не уйдет из комбобокса, а юзер будет созерцать текст, который он выбрал своей мышью, и думать, почему это ничего не происходит. Нижеприведенное решение «фильтрует базар» событий Click, генерирующихся нажатиями на стрелочки клавиатуры, и вынуждает контрол потерять фокус.В секции Declarations формы введите следующее

    ' В VB3 надо поменять тип флага на integer
    Dim bNoise as Boolean
    ' True означает, что происходит «шум», на который не следует реагировать

    А этот код введите в секции события Form_Load:

    bNoise = False

            Этот код введите в событии KeyDown комбобокса:

    Private Sub cbTest_KeyDown(KeyCode As _
            Integer, Shift As Integer)
            ' если юзер использует стрелки для езды по списку комбобокса
            ' игнорировать события Click
            If KeyCode = vbKeyDown Or KeyCode _
                    = vbKeyUp Then bNoise = True
    End Sub

    Этот код вводится в событии Click комбобокса:

    Private Sub cbTest_Click()
            If bNoise Then
                    ' Ignore Noise events
                    ' (up or down arrow)
                    bNoise = False
            Else
                    ' Увести фокус с контрола
                    SendKeys "{TAB}", True
            End If
    End Sub

    Теперь Вам остается написать код, содержащий реакцию на выбор юзера, и занести его в секцию события LostFocus комбика.
     

    Назад к СОДЕРЖАНИЮ

     

    2. КОММЕНТИРОВАНИЕ И РАСКОММЕНТИРОВАНИЕ БЛОКОВ КОДА

    VB5
    Level: Beginning
     

    VB 5.0 позволяет Вам разом закомментировать целый блок кода, а затем также быстро раскомментировать его. Это очень полезно при отладке, когда Вам не нужно исполнять целый ряд операторов, и в то же время Вы не можете их удалить вот так вот просто за здорово живешь. Между тем, пара кнопарей Comment/Uncomment присутствует только в тулбаре Edit, который надо специально вызывать :-(. Чтобы быстро вызвать тулбар Edit, кликните правой кнопкой мыши на любом тулбаре в VB, и выберите затем команду Edit.
     
     
     
     

    Назад к СОДЕРЖАНИЮ 


     

    3. ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ДЛЯ НЕОБЯЗАТЕЛЬНЫХ ПАРАМЕТРОВ

    VB5
    Level: Beginning

    Если Вы когда-либо программили на VB4, то Вы возможно пользовались мощной фишкой под названием Необязательные параметры (Optional parameters). VB5 пошел еще дальше: теперь эти параметры могут быть любого типа (не только Variants), и могут появляться в процедурах Property. Интересно, что Вы можете теперь задавать для них значение по умолчанию.

    Property Get Value _
            (Optional index As Long = 1)
    End Property

    Вы можете теперь делать это без бывшего ранее обязательным (и жутко тормозным) тестом IsMissing:

    Property Get Value _
            (Optional index As Long)
    If IsMissing(index) Then index = 1
    ...
    End Property

     

    Назад к СОДЕРЖАНИЮ

    4. НЕ СОЗДАВАЙТЕ ALIAS-НЫХ ПЕРЕМЕННЫХ

    VB5
    Level: Beginning

    Никогда не передавайтe глобальную переменную в качестве аргумента в процедуру, которая также напрямую обращается к этой переменной из себя (зачем??). Если Вы на 100% уверены, что следуете этому правилу в Ваших программах, то зачеркните опцию Assume No Aliasing в диалоговом окне Advanced Optimizations, которое вызывается из пункта Compile диалога Project Properties (уф, надеюсь, понятно). Если компилятор native code знает, что этих самых alias-ных переменных нет, то он спокойно копирует значения переменных в шустрые регистры ЦПУ, и переписывает их значения обратно в RAM только при выходе из процедуры. Это увеличивает скорость исполнения скомпилированных программ.
     
     
     

    Назад к СОДЕРЖАНИЮ

    5. ЦЕНТРИРОВАНИЕ ФОРМЫ НА ЭКРАНЕ

    VB5
    Level: Beginning

    Все знают о маленьком кодике, позволяющем Вам центрировать форму на экране вне зависимости от графического разрешения. Теперь Вы можете достичь того же результата, всего лишь присвоив значение vbStartUpScreen (=2) новому свойству StartUpPosition формы (появилось в версии 5). Вы даже можете отцентрировать форму относительно ее родительского окна, присвоив значение vbStartUpOwner (=1). Присвоение можно сделать в окне Property соответствующей формы. Когда Вы центрируете  форму внутри родительского окна, не забудьте добавить второй аргумент в методе Show.

    Form2.Show vbModal, Me
     
     

     

    Назад к СОДЕРЖАНИЮ

    6. НЕ УВЛЕКАЙТЕСЬ АВТООПТИМИЗИЦИЕЙ FAST CODE

    VB5
    Level: Beginning

    Если взглянуть на опции native code оптимизации, то сперва так и подмывает щелкнуть на "Optimize for Fast Code". Однако, как ни странно это может прозвучать, данное действие далеко не всегда гарантирует ожидаемый эффект. Аппликухи, оптимизированные на скоростное исполнение, как правило, не оптимизируются (пардон за каламбур), а лишь получают большее количество памяти при загрузке. Это обращается для них более медленной загрузкой, что особенно заметно на машинах с недостаточным количеством RAM, и в итоге создает впечатление, что Ваша аппликуха работает медленнее, нежели оптимизированная под компактный код. По той же самой причине, советуется компилить аппликухи в P-code. В случае объемных, UI- и базоданских аппликух, выигрыш от компиляции в native-code отнюдь не перевесит увеличения размера аппликухи. Вообще, чтобы точно знать, какая компиляция нужна Вам, юзайте VB Application Performance Explorer (APE), который лежит на VB CD.
     

    Назад к СОДЕРЖАНИЮ

    7. НЕ ВСЕ ШАБЛОНЫ СОЗДАНЫ ОДИНАКОВО

    VBA5
    Level: Beginning

    В отличие от других продуктов Office 97, шаблоны Word 97 содержат business-application engine, который хранится отдельно от документов, использюущих этот engine. Основанные на шаблонах книги Excel и презентации PowerPoint  хранят в себе шаблоны, на основе которых они созданы. На практике, все документы Word состоят из 2х VBA проектов: первый проект создан на базе основного(оригинального, хранящегося в Word) шаблона (все документы Word основаны на шаблонах), а второй проект принадлежит самому документу Word. С другой стороны, книги Excel и презентации PowerPoint, созданные на шаблонах, содержат только один VBA проект. Каждый файл содержит свою собственную копию проекта оригинального шаблона. Изменения, производимые в этом шаблоне, не затрагивают основной шаблон, хранящийся в приложении.
     

    Назад к СОДЕРЖАНИЮ

    8. НАСТРОЙКА ТУЛБАРОВ В VB

    VB5
    Level: Beginning

    Вот несколько предложений по настройке IDE в VB5:
    Добавить закладки в тулбокс можно, кликнув правой кнопкой мыши на кнопке General (что на тулбоксе), и выбрав Add Tab. Вы можете также перемещать и удалять закладки, и перемещать иконы контролов с одной закладки на другую, используя обычный метод drag-and-drop.
    Вытащить кнопку любого пункта меню на тулбар можно, кликнув правой кнопкой на любом тулбаре и выбрав пункт Customize. Перейдите на закладку Commands, выберите нужный пункт меню в правом окошке, и перетащите его на тулбар. Первыми кандидатами на добавление являются пункты Project-References,Project-Properties, и Tools-Add Procedure.
    Как создать совершенно новый тулбар на вкладке Toolbars диалогового окна Customize. После того, как Вы определили содержимое будущего тулбара, для добавления кнопок на этот тулбар используйте описанную абзацем выше процедуру. Когда у Вас на экране активизировано диалоговое окно Customize, кликните правой кнопкой на любой кнопке тулбара и Вы сможете поменять рисунок кнопки, создать разделитель, спрятать/показать текст и т.д.
     

    Назад к СОДЕРЖАНИЮ

    9. КАК СПРЯТАТЬ ВСЕ ОКОШКИ ПРОЕКТА

    VB5
    Level: Beginning

    Когда Вы работаете с несколькими пректами сразу, можно запутаться в нагромождении туевой хучи окошек из разных проектов. Однако, Вы можете временно спрятать все окошки, относящиеся к данному проекту, щелкнув по пиктограмме проекта в окошке Project Explorer так, чтобы все ветви, торчащие из него, исчезли. Тогда же свернутся и все окна, относящиеся к данному проекту. Эту возможность можно отменить, щелкнув на сответствующем квадратике на закладке General в меню Tools-Options.
     

    Назад к СОДЕРЖАНИЮ

    10. STANDALONE БИБЛИОТЕКИ ТИПОВ

     VB4 16/32, VB5 (Enterprise Edition)
    Level: Intermediate

    Koгда Вы создаете Ваш out-of-process OLE сервер, то VB встраивает библиотеку типов сервера (companion type library) в EXE-файл, не генерируя при этом .TLB файл. Однако, если у Вас Enterprise Edition VB4 или VB5, то зачеркнув квадратик Remote Server File, Вы заставите VB создавать standalone билиотеку типов. В VB5, эта опция находится на вкладке Component диалогового окна Properties меню Project.
     
     

    Назад к СОДЕРЖАНИЮ

    11. ИСПОЛЬЗОВАНИЕ OBJECT BROWSER’a длЯ нахождениЯ недокументированных возможностей

    VB5
    Level: Intermediate
    Если кликнуть правой кнопкой мыши в правом окошке Object Browser’а (там, где нарисованы члены классов), то выскочит контекстное меню с командой Show Hidden Members. Если щелкнуть на этой команде, то отныне Object Browserбудет показывать все hidden-свойства и методы (а также и классы) любой библиотеки, и Вы можете использовать это для более детального исследования библиотек объектов.
    Например, в библиотеке VBA есть hidden класс под названием _HiddenModule, в который входят многие известные функции VBA плюс три недокументированные: ObjPtr, StrPtr, и VarPtr. ObjPtr возвращает адрес private area экземпляра объекта, StrPtr возвращает адрес первого символа в строке, VarPtr возвращает адрес переменной или дескриптора строки (string descriptor), если имеем случай переменной типа string.
     
     

    Назад к СОДЕРЖАНИЮ

    12. АДРЕС ПЕРЕМЕННОЙ

     VB4 16/32
    Level: Advanced

    В VB5 есть встроенная функция VarPtr (см. Совет «ИСПОЛЬЗОВАНИЕ OBJECT BROWSER’a длЯнахождениЯ недокументированных возможностей»), но этой функции нет в VB4. Runtime library в VB4 включает эту функцию, но перед использованием ее нужно сначала объявить:

    #If Win16 Then
    Declare Function VarPtr Lib  "VB40016.DLL" (variable As Any)  As Long
    #Else
    Declare Function VarPtr Lib  "VB40032.DLL" (variable As Any)   As Long
    #End If

    Эта функция полезна при передаче пользовательских типов (Type structure) во внешнюю процедуру API, и в этом типе какое-либо из полей является адресом другой переменной или записи.
     

    Назад к СОДЕРЖАНИЮ

    13. КОГДА BENCHMARK’и (ИЗМЕРЕНИЯ СКОРОСТИ РАБОТЫ ПРОГИ) ДЛЯТСЯ СУТКАМИ

     VB4 16/32, VB5
    Level: Intermediate

    Обычно, программисты на VB измеряют скорость выполнения кода при помощи Timer функции. Однако, если Ваша программа должна завершиться на следующий день, то Вы должны учесть, что значение, возвращаемое функцией Timer, ресетится в полночь. Если же Вас устроит значение с точностью до одной секунды, Вы можете упростить Ваш код с помощью функции Now.

    Dim startTime As Date
    StartTime = Now
    ' the code to be benchmarked
    ' ...
    Print "elapsedSeconds = " & Format$   ((Now - startTime) * 86400, "#####")

    Вам понадобится функция Format$ для округления результата до целого.
     

    Назад к СОДЕРЖАНИЮ

    14. APP.PATH МОЖЕТ ВОЗВРАЩАТЬ UNC-ПУТИ

     
    VB5
    Level: Intermediate

    В отличие от VB4, App.Path в VB5 может возвращать UNC-путь, типа "\\server\programs\...", в зависимости от обстоятельств, от того как запущена программа и запущена она из VB IDE или скомпилирована в EXE-файл. Эта особенность может сильно испортить вам жизнь, если Вы используете App.Path для установки текущего каталога при старте программы.

    ChDrive App.Path
    ChDir App.Path

    Поскольку ChDrive на умеет обрабатывать UNC-пути, этот код может вызвать фатальную ошибку времени выполнения, но можт быть защищен использованием On Error Resume Next. Однако этот фикс не защитит Вас от всех невзгод, могущих произойти. Наилучшее решение состоит в том, чтоюы предоставить юзеру самому ввести каталог во время исполнения программы, затем записать полученный путь в регистр или INI-файл. Для более подробной инфы, см. статью Q167167 в Microsoft Knowledge Base.
     
     

    Назад к СОДЕРЖАНИЮ

    15 ЕЩЕ ОБ УНИВЕРСАЛЬНЫХ ПАРАМЕТРАХ МАССИВОВ

     VB4 16/32, VB5
    Level: Advanced
    Вы можете написать единую процедуру для любых типов массива  с любым типом в качестве аргумента, используя параметр типа Variant. Внутри процедуры, адресация элементов массива происходит обычным способом:

    ' return the number of items
    Function ItemCount(anArray As Variant) As Long
    ItemCount = UBound(anArray) - LBound(anArray) + 1
    ' the first element is
    ' anArray(LBound(anArray))
    End Function

    Вы можете даже запулить в процедуру многомерный массив с любым колическтвом измерений, а чтобы разобраться, сколько же у этого массива измерений, нужно производить обращения к функциям UBound и Lbound до возникновения ошибки:

    Function ItemCount(anArray As Variant)As Long
    Dim items As Long, i As Integer
    On Error Resume Next
    items = UBound(anArray) - LBound(anArray) + 1
    For i = 2 to 999
            items = items * (UBound(anArray, _
                    i) - LBound(anArray, i) + 1)
            If Err Then Exit For
    Next
    ItemCount = items
    End Function
     
     

    Назад к СОДЕРЖАНИЮ

    16. УМЕНЬШИТЬ РАЗМЕР КОДА, ИСПОЛЬЗУЯ ОПЕРАТОРЫ IIF И SWITCH

    VB4 16/32, VB5
    Level: Intermediate
    Часто бывает целесообразным заменить блок If...Then...Else более компактной функцией Iif:

    ' возвращает большую из двух сравниваемых величин
    maxValue = IIf(first >= second,first, second)

    Switch - редко используемая функция, даже в тех многочисленных случаях, когда она более полезна нежели длиннющий блок If...ElseIf:

    ' надо узнать, х полижительный, отрицательный, или равен 0?
    Print Switch(x < 0, "negative", x > 0, _
            "positive", True, "Null")

    Заметим, что значение последней проверки всегда True, так как три условия являются взаимно исключающими и избыточными.
     

    Назад к СОДЕРЖАНИЮ

    17. УСКОРЬТЕ ВАШ КОД ИСПОЛЬЗОВАНИЕМ CHOOSE

    VB3, VB4 16/32, VB5
    Level: Beginning

    Вы можете использовать  Choose там, где можно заменить массив или построить таблицы результатов, на стадии компиляции (compile-time), вместо того, чтобы делать это на стадии выполнения (run time). Например, если Вам надо знать значения факториалов чисел от 1 до 10, попробуйте следующий пример (Choose производит выбор факториала из набора имеющихся значений всесто того, чтобы высчитывать факториал каждый раз заново):

    Function Factorial(number As Integer) _
            As Long
    Factorial = Choose(number, 1, 2, 6, _
            24, 120, 720, 5040, 40320, _
            362880, 3628800)
    End Function
     
     

    Назад к СОДЕРЖАНИЮ

    18. GOSUBS РАБОТАЮТ МЕДЛЕННО В ОТКОМПИЛИРОВАННЫХ ПРОГРАММАХ

     VB5
    Level: Intermediate

    Поскольку использование GoSubs относится к неструктурированному стилю программирования, то многие программисты стараются избегать его. Если Вы компилируете Вашу VB5 аппликуху в native code, у Вас появится еще одна причина избегать этот оператор, поскольку вызовы через GoSubs могут происходить в пять раз медленнее, чем вызовы обычной процедуры или функции.
     
     

    Назад к СОДЕРЖАНИЮ

    19. «ARRAY» - ОТНЫНЕ ЭТО ОШИБОЧНОЕ ИМЯ ДЛЯ ПЕРЕМЕННЫХ

    VB5
    Level: Intermediate

    Если Вы, как и я, часто используете имя "array" для переменных, Вам придется пересмотреть Ваш код при переносе его под VB5. Это слово является теперь зарезервированным (reserved keyword) и не может быть использовано в качестве имени переменной. Вы можете легко переделать Ваш код при помощи команды Replace в IDE VB5, не забудьте при этом черкнуть "Find whole words only".
     

    Назад к СОДЕРЖАНИЮ

    20. ЗАПУСК AUTOMATION MANAGER КАК HIDDEN ЗАДАЧИ

    VB4 16/32, VB5 Enterprise Edition
    Level: Advanced

    Если Вы мспользуете OLE Remote Automation, Вы должны заранее запустить Automation Manager на сервере до того как случится первая OLE remote communication. По умолчанию, это приложение visible, но Вы можете его спрятать, чтобы оно не мозолило глаза на таскбаре Чикаги. Для этого создайте ярлык для Automation Manager, который бы включал в командной строке переключатель /Hidden:
    C:\Windows\System\AutMgr32.Exe /Hidden
    С другой стороны, Вы можете поменять значение соответствующего ключа в регистре. Для более полной инфы, см. Статью Q138067 in the Microsoft Knowledge Base.

    Назад к СОДЕРЖАНИЮ

    21. ПРОБЛЕМЫ СО ВСПЛЫВАЮЩИМИ МЕНЮ

     VB4 16/32, VB5
    Level: Advanced

    Если Вы используете всплывающие меню (popup menus) в Ваших прогах, то опасайтесь бага, имеющегося в VB4 16/32 и VB5. Если у Вас есть две формы и одна из них вызывает вторую модальную через всплывающее меню, то из этой второй модальной Вы не сможете вызвать ни одного всплывающего меню, сколько бы их на ней ни было. Чтобы пофиксить это дело, используйте таймер на первой форме. Вместо показа фторой формы из всплывающего меню по событию Click, активизируйте таймер так, чтобы он показал эту вторую форму через несколько миллисекунд. Для более полной инфы, см. Статью Q167839 in the Microsoft Knowledge Base.
     
     

    Назад к СОДЕРЖАНИЮ


    22.  ИСПОЛЬЗОВАНИЕ КОЛЛЕКЦИИ ДЛЯ ОТФИЛЬТРОВЫВАНИЯ ДУБЛИРОВАННЫХ ЗНАЧЕНИЙ

    VB4 16/32, VB5
    Level: Intermediate
    Этот код иллюстрирует, как использовать коллекции (Collection) для генерации уникального набора величин из набора, содержащего дубликаты. В этом примере, сканируется массив строк и сортируются все уникальные с использованием list-box контрола:

    Sub Remove_Duplicates(arr() As String)
            Dim i As Long
            Dim RawData As String
            Dim DataValues As New Collection

            On Error Resume Next
            ' это вставлено для игнорирования ошибки 457 - Duplicate key
            For i = LBound(arr) To UBound(arr)
                    RawData = arr(i)
                    DataValues.Add RawData, RawData
                    ' Если Run-time error 457 случилась, то повторяющееся значение игнорируется
            Next
            On Error GoTo 0

            ' Сохранение в List Box
            ' (свойство Sorted выставлено True)
            lstSortedData.Clear
            For Each DataValue In DataValues
                    lstSortedData.AddItem DataValue
            Next
    End Sub
     

    Назад к СОДЕРЖАНИЮ

    23. СОЗДАНИЕ «УДАЛЕННО КОНТРОЛИРУЕМЫХ» ФОРМ

    VB3
    Level: Intermediate

    Иногда мне требуется котролировать одну форму, когда фокус находится на другой. Например, когда я жму «ОК» на форме А, мне надо сделать resize на форме В. Итак, на каждой форме, которую мне надо «удаленно контролировать», я делаю невидимый text box, назовем его TextCommand, в событии Change которого находится следующий код:

    Sub TextCommand_Change ()
            Dim msg as string
            msg = Trim$(Me.TextCommand.Text)
            If Len(msg) = 0 Then Exit Sub

            Select Case msg
                    Case "COMMAND_RESIZE"
                            Call MyFormResize
                    Case "COMMAND_REPAINT"
                            Call MyFormPaint
                    ...
            End Select
            Me.TextCommand = ""
    End Sub

    Вы можете удаленно контролировать форму, засылая соответствующее значение в ее TextCommand:

    Sub Command1_Click ()
            formB.TextCommand = "COMMAND_RESIZE"
            DoEvents
    End Sub

    Этот код можно использовать для отсылки мессагов из MDI формы к потомкам:

    Dim f As Form
    Set f = Me.ActiveForm
    f.TextCommand = "COMMAND_RESIZE"

    Если Вы сидите под VB4 или VB5, Вы можете также использовать Public-свойства и методы формы.
     

    Назад к СОДЕРЖАНИЮ

    24. ЗАПИСЬ ТЕКУЩЕЙ ПОЗИЦИИ И РАЗМЕРА ФОРМЫ ПРИ ПОМОЩИ SAVESETTING

    VB4 16/32, VB5
    Level: Intermediate
    Функции SaveSetting и GetSetting облегчают написание сеттингов в аппликухах. Эти две функции восстанавливают и запоминают текущие позиции формы:

    Public Sub FormPosition_Get(F As Form)
    ' Считывает позицию формы F из
    ' ini/reg файла и соответственно
    ' позиционирует форму
    Dim buf As String
    Dim l As Integer, t As Integer
    Dim h As Integer, w As Integer
    Dim pos As Integer

    buf = GetSetting(app.EXEName, _
            "FormPosition", F.Tag, "")
    If buf = "" Then
            ' defaults для центрирования фромы
            F.Move (Screen.Width - F.Width) \ _
                    2, (Screen.Height - F.Height) \ 2
    Else
            ' выделить l,t,w,h и выставить форму
            pos = InStr(buf, ",")
            l = CInt(Left(buf, pos - 1))
            buf = Mid(buf, pos + 1)
            pos = InStr(buf, ",")
            t = CInt(Left(buf, pos - 1))
            buf = Mid(buf, pos + 1)
            pos = InStr(buf, ",")
            w = CInt(Left(buf, pos - 1))
            h = CInt(Mid(buf, pos + 1))
            F.Move l, t, w, h
    End If
    End Sub

    Public Sub FormPosition_Put(F As Form)
    ' Пишет op,left,height и
    ' width позиции формы F в reg/ini файл аппликухи
    Dim buf As String
    buf = F.left & "," & F.top & "," & _
            F.Width & "," & F.Height
    SaveSetting app.EXEName,_
            "FormPosition", F.Tag, buf
    End Sub

    Вам следует поместить эти процедуры в модуль и вызывать их из событий Load и Unload форм. Вы должны написать имя формы в ее свойство Tag, чтобы эти процедуры работали корректно

    Sub Form_Load()
            FormPosition_Get Me
    End Sub
    Sub Form_Unload()
            FormPosition_Put Me
    End Sub
     

    Назад к СОДЕРЖАНИЮ


    25. ЭФФЕКТИВНОЕ ИСПОЛЬЗОВАНИЕ ВНУТРЕННИХ VB КОНСТАНТ

    VB4 16/32, VB5
    Level: Beginning

    Мне приходилось видеть некоторые советы по использованию числовых значений вместо соответствующих VB констант. Например, Вы можете вывести message box, используя числовые константы:

    rc = MsgBox(msg, 4 + 32 + 256, "Confirm Delete")

    Но не легче ли прочесть следующее?

    rc = MsgBox(msg, vbYesNo + vbQuestion _
            + vbDefaultButton2, _
            "Confirm Delete")

    Вы можете использовать следующие константы для check box:

            VbUnchecked =0
            VbChecked =1
            VbGrayed =2

    Также полезно знать строковые константы вместо соответствующих chr$(символы ASCII):

    vbTab instead of Chr$(9)
            vbCr instead of Chr$(13)
            vbLf instead of Chr$(10)
            vbCrLf instead of Chr$(13)+Chr$(10)

    Назад к СОДЕРЖАНИ



     

     

    26 ПРАВИЛЬНЫЙ ТЕСТ НА "FILE EXIST"

    VB3, VB4 16/32, VB5
    Level: Intermediate

    Dir$ генерирует runtime error, если ему суют несуществующее имя диска. Например, Dir$ ("d:\win\himems.sys") умирает , если  драйв d: не существует. Для проверки существования файла, добавьте обработчик ошибки:

    Function FileExist(filename As String) _
            As Boolean
            On Error Resume Next
            FileExist = Dir$(filename) <> ""
            If Err.Number <> 0 Then FileExist _
                    = False
            On Error GoTo 0
    End Function
     
     

    Назад к СОДЕРЖАНИЮ

    27. ПРОЦЕДУРЫ, РАБОТАЮЩИЕ С ГРУППАМИ КОНТРОЛОВ

    VB4 16/32, VB5
    Level: Intermediate

    Вы можете использовать почти забытую возможность VB иметь процедуру или функцию, работающую с неограниченным числом аргументов, что может быть полезно при работе с множеством контролов. Например, Вы можете enable/disable группу контролов одним вызовом процедуры:

    EnableAll True, Text1, Text2, _
            Command1, Command2

    Эта процедура проходит по всем контролам, передаваемым в качестве аргументов:

    Sub EnableAll(Enabled As Boolean, _
            ParamArray objs() As Variant)
                    Dim obj As Variant
                    For Each obj In objs
                            obj.Enabled = Enabled
                    Next obj
    End Sub
     

    Назад к СОДЕРЖАНИЮ

    28 УЛУЧШЕНИЕ СКРОЛЛИНГА РИСУНКОВ

    VB3, VB4 16/32, VB5
    Level: Intermediate
    Во-первых, сделайте, чтобы событие Scroll скроллбара картинки обновляло координаты картинки (как будто бы она движется) когда Вы возите мышой по картинке. Затем, объявите следующие переменные на уровне формы:

    Dim StartX As Long, StartY As Long
    Dim Moving As Boolean

    Finally, declare these three events for PicPicture:
    Наконец, объявите эти три события для PicPicture:

    Private Sub PicPicture_MouseDown_
            (Button As Integer, Shift As _
            Integer, x As Single, y As Single)
                    StartX = x
                    StartY = y
                    Moving = True
    End Sub

    Private Sub PicPicture_MouseMove_
            (Button As Integer, Shift As _
            Integer, x As Single, y As Single)
                    If Moving Then
                            PicPicture.Move _
                                    PicPicture.Left + x - StartX, PicPicture.Top + y - StartY
                    End If
    End Sub

    Private Sub PicPicture_MouseUp_
            (Button As Integer, Shift As _
            Integer, x As Single, y As Single)
                    Moving = False
    End Sub

    Теперь Вы можете скроллить картинку мышой. Не забудьте проверить границы картинки.

     
    Назад к СОДЕРЖАНИЮ


    29. ЗАШИФРОВАННЫЕ ПАРОЛИ

     VB3, VB4 16/32, VB5
    Level: Intermediate

    Следующие две функции легко и эффективно шифрут/дешифруют текстовый пароль. Функции имеют два аргумента: число от 1 до 10 чтобы сдвигать позицию символа ASCII в пароле, и собственно строка пароля. Функция EncryptPassword проходит через каждый символ строки DecryptedPassword, проверяет символ на четность/нечетность, и сдвигает его вверх/вниз согласно параметру Number. Эту делает зашифрованную строку нечитабельной. Зашифрованный пароль «укатывается» затем оператором XOR, который еще более запутывает строку. Я ограничил параметр Number числом 10, поскольку мне не надо делать проверку на «неправильные» символы ASCII. Функция DecryptPassword повторяет в обратном порядке процесс шифрования, применяя XOR, а затем сдвиг.

    Function EncryptPassword(Number As _
            Byte, DecryptedPassword As String)
    Dim Password As String, Counter As Byte
    Dim Temp As Integer

    Counter = 1
    Do Until Counter = _
            Len(DecryptedPassword) + 1
            Temp = Asc(Mid(DecryptedPassword, _
                    Counter, 1))
            If Counter Mod 2 = 0 Then
                    'see if even
                    Temp = Temp - Number
            Else
                    Temp = Temp + Number
            End If
            Temp = Temp Xor (10 - Number)
            Password = Password & Chr$(Temp)
            Counter = Counter + 1
    Loop
    EncryptPassword = Password
    End Function

    Function DecryptPassword(Number As _
            Byte, EncryptedPassword As String)
    Dim Password As String, Counter As Byte
    Dim Temp As Integer

    Counter = 1
    Do Until Counter = _
            Len(EncryptedPassword) + 1
            Temp = Asc(Mid(EncryptedPassword, _
                    Counter, 1)) Xor (10 - Number)
            If Counter Mod 2 = 0 Then 'see if even
                    Temp = Temp + Number
            Else
                    Temp = Temp - Number
            End If
            Password = Password & Chr$(Temp)
            Counter = Counter + 1
    Loop
    DecryptPassword = Password
    End Function

    Назад к СОДЕРЖАНИЮ


    30. ПРОПИСНЫЕ-СТРОЧНЫЕ БУКВЫ - СОВЕТ ПО СЛЕЖЕНИЮ ЗА РЕГИСТРОМ БУКВ

    VB4 16/32, VB5
    Level: Intermediate
    Если Вы используете левую стрелку на клаве, чтобы перейти к началу слова, а затем нажимаете букву, то в итоге Вы получаете две заглавных буквы (первая уже была, а вторую ввели Вы - я так понимаю??). Применив код, который использует преимущества встроенной в VB4/VB5 функции StrConv(), Вы получите автоматическое приведение букв в нужный регистр во время ввода:

    Private Sub Text1_Change()
            If Text1.Tag = "" Then
                    Text1.Tag = Text1.SelStart
                    Text1.Text = StrConv(Text1.Text,        vbProperCase)
                    Text1.SelStart = Text1.Tag
                    Text1.Tag = ""
            End If
    End Sub
     

    Назад к СОДЕРЖАНИЮ


Rambler's Top100 Rambler's Top100 Рейтинг@Mail.ru

Сайт создан в системе uCoz